//! 中国行政区划数据模块

use lazy_static::lazy_static;
use serde_json::Value;
use std::sync::Arc;
use rand::prelude::SliceRandom;
use rand::Rng;

lazy_static! {
    /// 最新行政区划数据
    pub static ref PROVINCES: Arc<[&'static str]> = Arc::new([
        // 添加行政区划后缀
        "北京市", "天津市", "河北省", "山西省", "内蒙古自治区",
        "辽宁省", "吉林省", "黑龙江省", "上海市", "江苏省",
        "浙江省", "安徽省", "福建省", "江西省", "山东省",
        "河南省", "湖北省", "湖南省", "广东省", "广西壮族自治区",
        "海南省", "重庆市", "四川省", "贵州省", "云南省",
        "西藏自治区", "陕西省", "甘肃省", "青海省", "宁夏回族自治区",
        "新疆维吾尔自治区", "台湾省", "香港特别行政区", "澳门特别行政区"
    ]);

    /// GB2312 一级汉字（3755个）和二级汉字（3008个）的 Unicode 范围
    static ref GB2312_RANGES: [(u32, u32); 72] = [
        // 一级汉字（16-55区）
        (0xB0A1, 0xB0FE), // 16区
        (0xB1A1, 0xB1FE), // 17区
        (0xB2A1, 0xB2FE), // 18区
        (0xB3A1, 0xB3FE), // 19区
        (0xB4A1, 0xB4FE), // 20区
        (0xB5A1, 0xB5FE), // 21区
        (0xB6A1, 0xB6FE), // 22区
        (0xB7A1, 0xB7FE), // 23区
        (0xB8A1, 0xB8FE), // 24区
        (0xB9A1, 0xB9FE), // 25区
        (0xBAA1, 0xBAFE), // 26区
        (0xBBA1, 0xBBFE), // 27区
        (0xBCA1, 0xBCFE), // 28区
        (0xBDA1, 0xBDFE), // 29区
        (0xBEA1, 0xBEFE), // 30区
        (0xBFA1, 0xBFFE), // 31区
        (0xC0A1, 0xC0FE), // 32区
        (0xC1A1, 0xC1FE), // 33区
        (0xC2A1, 0xC2FE), // 34区
        (0xC3A1, 0xC3FE), // 35区
        (0xC4A1, 0xC4FE), // 36区
        (0xC5A1, 0xC5FE), // 37区
        (0xC6A1, 0xC6FE), // 38区
        (0xC7A1, 0xC7FE), // 39区
        (0xC8A1, 0xC8FE), // 40区
        (0xC9A1, 0xC9FE), // 41区
        (0xCAA1, 0xCAFE), // 42区
        (0xCBA1, 0xCBFE), // 43区
        (0xCCA1, 0xCCFE), // 44区
        (0xCDA1, 0xCDFE), // 45区
        (0xCEA1, 0xCEFE), // 46区
        (0xCFA1, 0xCFFE), // 47区
        (0xD0A1, 0xD0FE), // 48区
        (0xD1A1, 0xD1FE), // 49区
        (0xD2A1, 0xD2FE), // 50区
        (0xD3A1, 0xD3FE), // 51区
        (0xD4A1, 0xD4FE), // 52区
        (0xD5A1, 0xD5FE), // 53区
        (0xD6A1, 0xD6FE), // 54区
        (0xD7A1, 0xD7FE), // 55区

        // 二级汉字（56-87区）
        (0xD8A1, 0xD8FE), // 56区
        (0xD9A1, 0xD9FE), // 57区
        (0xDAA1, 0xDAFE), // 58区
        (0xDBA1, 0xDBFE), // 59区
        (0xDCA1, 0xDCFE), // 60区
        (0xDDA1, 0xDDFE), // 61区
        (0xDEA1, 0xDEFE), // 62区
        (0xDFA1, 0xDFFE), // 63区
        (0xE0A1, 0xE0FE), // 64区
        (0xE1A1, 0xE1FE), // 65区
        (0xE2A1, 0xE2FE), // 66区
        (0xE3A1, 0xE3FE), // 67区
        (0xE4A1, 0xE4FE), // 68区
        (0xE5A1, 0xE5FE), // 69区
        (0xE6A1, 0xE6FE), // 70区
        (0xE7A1, 0xE7FE), // 71区
        (0xE8A1, 0xE8FE), // 72区
        (0xE9A1, 0xE9FE), // 73区
        (0xEAA1, 0xEAFE), // 74区
        (0xEBA1, 0xEBFE), // 75区
        (0xECA1, 0xECFE), // 76区
        (0xEDA1, 0xEDFE), // 77区
        (0xEEA1, 0xEEFE), // 78区
        (0xEFA1, 0xEFFE), // 79区
        (0xF0A1, 0xF0FE), // 80区
        (0xF1A1, 0xF1FE), // 81区
        (0xF2A1, 0xF2FE), // 82区
        (0xF3A1, 0xF3FE), // 83区
        (0xF4A1, 0xF4FE), // 84区
        (0xF5A1, 0xF5FE), // 85区
        (0xF6A1, 0xF6FE), // 86区
        (0xF7A1, 0xF7FE)  // 87区
    ];
}

/// 生成随机省份
pub fn province() -> Value {
    let mut rng = rand::thread_rng();
    Value::String(
        PROVINCES.choose(&mut rng)
            .unwrap()
            .to_string()
    )
}

/// 生成指定长度的中文街道前缀
pub fn rand_chinese(range: std::ops::Range<usize>) -> String {
    let len = rand::Rng::gen_range(&mut rand::thread_rng(), range);
    (0..len).map(|_| rand_hanzi()).collect()
}

/// 生成随机中文街道
pub fn random_street() -> Value {
    let mut rng = rand::thread_rng();
    // 街道名前缀长度（2-4个汉字）
    let prefix_len = rng.gen_range(2..=4);
    let suffix = ["街", "路", "巷", "大道", "胡同"].choose(&mut rng).unwrap();

    let prefix: String = (0..prefix_len)
        .map(|_| rand_hanzi())
        .collect();

    Value::String(format!("{}{}", prefix, suffix))
}

/// 生成单个汉字（常用字范围）, 限制到常用汉字范围（0x4E00-0x62FF）包含约5000常用字
pub fn rand_hanzi() -> char {
    let mut rng = rand::thread_rng();
    // let unicode_chars: Vec<char> = (0..1)
    //     .map(|_| rng.gen_range(0x4E00..=0x9FA5) as u32)
    //     .map(std::char::from_u32)
    //     .flatten()
    //     .collect();
    // unicode_chars.into_iter().collect()

    let code = rng.gen_range(0x4E00..=0x9FA5);
    std::char::from_u32(code).unwrap_or('汉')
}

/// 生成随机的Unicode字符
/// 生成范围在0x4E00到0x9FFF之间的随机数，将其转换为Unicode字符，并将它们收集到一个Vec<char>中。
/// 最后，通过迭代Vec<char>并将字符收集到一个String中，生成了一个随机的Unicode字符串
///
/// 请注意，这个方法生成了基本的CJK（中日韩）字符范围内的Unicode字符
pub fn generate_random_unicode() -> String {
    let mut rng = rand::thread_rng();
    let unicode_chars: Vec<char> = (0..1)
        .map(|_| rng.gen_range(0x4E00..=0x9FFF) as u32)
        .map(std::char::from_u32)
        .flatten()
        .collect();

    unicode_chars.into_iter().collect()
}

pub fn is_uncommon_hanzi(c: char) -> bool {
    let code = c as u32;

    !GB2312_RANGES.iter().any(|&(start, end)| code >= start && code <= end)
        // || code.is_ascii()  // 排除ASCII字符
        || c.is_ascii_punctuation() // 排除标点
}
